在 Kuick ORM 裡,Entity 採行繼承設計,取得內建的多項功能,其中包含自我描述規格,以及可以直接與資料庫溝通,不像其他 ORM Framework 需要透過類似資料庫或是資料庫連線物件間接處理 (例如 EF 的 ObjectContext, DbContext)。
這篇分享以 Entity『自我描述規格』『直接存取資料』為主題,作為進階說明的開始,同時說明 Kuick 的資料操作方法命名規則。

『自我描述規格』已經在前篇分享『Kuick Entity:Schema Cache 規格快取』說明,本文將重點放在『直接存取資料庫』的功能上。
<資料操作方法命名規則>
有關於資料操作方法命名規則,簡略劃分成『表現層』、『邏輯層』、『資料層』3 個層次命名如下。切記,在考量特定的宗教信仰時,新增方法不可使用 Create 為名,因為 Create 只能由上帝來執行。

<直接存取資料>
對資料庫的操作分成靜態的類別方法 (class function) 與物件方法 (instance function),其中對於單筆資料的新增、修改、刪除是屬於物件方法之外,其餘的屬於類別方法,設計期未知的資料操作方法,大部份實作於 Kuick.Entity 裡,設計期已知的資料操作方法,則大部份實作於 Kuick.Entity<T> 裡,下列依據資料的 CRUD 與直接執行指令分項說明,再將實作於 Kuick.Entity, Kuick.Entity<T> 裡相關的定義摘要如下:

新增
資料新增屬於物件方法
UserEntity user = new UserEntity();
// ...
Result result = user.Add();
選取
內建 9 種資料選取相關的類別方法
修改
資料修改屬於物件方法
UserEntity user = UserEntity.Get("kevinjong");
// ...
Result result = user.Modify();
刪除
資料刪除屬於物件方法
UserEntity user = UserEntity.Get("kevinjong");
// ...
Result result = user.Remove();
執行 Sql Command 或 Stored Procedure
下載原始檔 --> kuick.codeplex.com
public class Entity 
	: DynamicData, IEntity, IIsNull, IValidate, IDynamicData
{
	// 物件方法 (instance function)
	public Result Add();
	public Result Modify();
	public Result Remove();
	// 類別方法 (class function)
	public static Result ExecuteNonQuery(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static Result ExecuteNonQuery(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteQuery(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteQuery(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static Any ExecuteScalar(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static Any ExecuteScalar(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteStoredProcedure(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteStoredProcedure(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static bool Exists(
		string entityName, 
		params Any[] anys
	);
	public static IEntity Get(
		string entityName, 
		string keyValue
	);
	public static List<IEntity> GetAll(
		string entityName
	);
	
	public static List<IEntity> Query(
		string entityName, 
		params Any[] anys
	);
	public static IEntity QueryFirst(
		string entityName, 
		params Any[] anys
	);
	public static Result Remove(
		string entityName, 
		string keyValue
	);
	public static List<IEntity> Search(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static List<IEntity> Search(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
}
public class Entity<T> 
	: Entity where T : class, IEntity, new()
{
	// 類別方法 (class function)
	public static int Count(
		Expression<Func<T, object>> expression
	);
	public static int Count(
		params Any[] anys
	);
	public static int Count(
		Expression<Func<T, object>> expression, 
		Action<Sql<T>> interceptor
	);
	public static Result ExecuteNonQuery(
		string sql, 
		params DbParameter[] parameters
	);
	public static List<T> ExecuteQuery(
		string sql, 
		params DbParameter[] parameters
	);
	public static Any ExecuteScalar(
		string sql, 
		params DbParameter[] parameters
	);
	public static List<T> ExecuteStoredProcedure(
		string sql, 
		params DbParameter[] parameters
	);
	public static bool Exists(
		Expression<Func<T, object>> expression
	);
	public static bool Exists(
		params Any[] anys
	);
	public static bool Exists(
		string keyValue
	);
	public static T Get(
		string keyValue
	);
	public static List<T> GetAll();
	public static List<T> Query(
		Expression<Func<T, object>> expression
	);
	public static T QueryFirst(
		Expression<Func<T, object>> expression
	);
	public static Result Remove(
		Expression<Func<T, object>> expression
	);
	public static Result Remove(
		params Any[] anys
	);
	public static Result Remove(
		string keyValue
	);
	public static List<T> Search(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static List<T> Search(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
}
======================================================
系統開發需正確處理『設計期』與『執行期』的差異,以及區分什麼是『設計議題』什麼是『部署議題』,下一篇說明 Kuick ORM 如何處理這些差異實作出更加直覺的 ORM Framework。
========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube